package system

import (
	"MoSkeleton/framework/core/dto/response"
	"MoSkeleton/framework/core/motypes"
	mapset "github.com/deckarep/golang-set/v2"
)

type SysUserDetailItemResp struct {
	response.ModelResp
	DeptId      uint64 `json:"deptId,string"`
	DeptName    string `json:"deptName"`
	UserName    string `json:"userName"`
	NickName    string `json:"nickName"`
	Email       string `json:"email"`
	Phonenumber string `json:"phonenumber"`
	Sex         string `json:"sex"`
	Avatar      string `json:"avatar"`
	Status      string `json:"status"`
	CreatedBy   string `json:"createdBy"`
	Remark      string `json:"remark"`

	Roles []*SysUserDetailRoleItemResp `gorm:"-" json:"roles"`
	Dept  *SysUserDeptItemResp         `gorm:"-" json:"dept"`
}

type SysUserDetailResp struct {
	User    *SysUserDetailItemResp        `json:"user"`
	Posts   *[]*SysPostItemResp           `json:"posts"`
	Roles   *[]*SysUserDetailRoleItemResp `json:"roles"`
	PostIds []string                      `json:"postIds"`
	RoleIds []string                      `json:"roleIds"`
}

type SysUserItemResp struct {
	response.ModelResp
	DeptId      uint64 `json:"deptId,string"`
	DeptName    string `json:"deptName"`
	UserName    string `json:"userName"`
	NickName    string `json:"nickName"`
	UserType    string `json:"userType"`
	Email       string `json:"email"`
	Phonenumber string `json:"phonenumber"`
	Sex         string `json:"sex"`
	Avatar      string `json:"avatar"`
	Status      string `json:"status"`
	CreatedBy   string `json:"createdBy"`
	Remark      string `json:"remark"`
}

type ExportUserItemResp struct {
	SysUserItemResp
	LoginIp   string          `json:"loginIp"`
	LoginDate *motypes.MoTime `json:"loginDate"`
	Leader    string          `json:"leader"`
}

// @swagger.Model
type SysUserInfoResp struct {
	// @swagger.Property
	Permissions *mapset.Set[string] `json:"permissions"`
	// @swagger.Property
	Roles *mapset.Set[string] `json:"roles"`
	User  *SysUserItemResp    `json:"user"`
}

func NewOnlineUserResp() *OnlineUserResp {
	permissions := mapset.NewSet[string]()
	return &OnlineUserResp{
		Permissions: &permissions,
	}
}

/*
在线用户实体
*/
type OnlineUserResp struct {
	/**
	 * 用户唯一标识
	 */
	Token string `json:"token"`

	/**
	 * 登录时间
	 */
	LoginTime *motypes.MoTime `json:"loginTime"`

	/**
	 * 过期时间
	 */
	ExpireTime *motypes.MoTime `json:"expireTime"`

	/**
	 * 登录IP地址
	 */
	Ipaddr string `json:"ipaddr"`

	/**
	 * 登录地点
	 */
	LoginLocation string `json:"loginLocation"`

	/**
	 * 浏览器类型
	 */
	Browser string `json:"browser"`

	/**
	 * 操作系统
	 */
	Os string `json:"os"`

	/**
	 * 权限列表
	 */
	Permissions *mapset.Set[string] `json:"permissions"`

	/**
	 * 用户信息
	 */
	User *SysUserDetailItemResp `json:"user"`
}

type UserProfileResp struct {
	RoleGroup string                 `json:"roleGroup"`
	PostGroup string                 `json:"postGroup"`
	User      *SysUserDetailItemResp `json:"user"`
}
